{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n",
      "sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.2\n",
      "pandas 0.24.2\n",
      "sklearn 0.20.3\n",
      "tensorflow 2.0.0-alpha0\n",
      "tensorflow.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "'''\n",
    "把输入数据 进行归一化操作\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 28, 28) (5000,)\n",
      "(55000, 28, 28) (55000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()\n",
    "x_valid, x_train = x_train_all[:5000], x_train_all[5000:]\n",
    "y_valid, y_train = y_train_all[:5000], y_train_all[5000:]\n",
    "\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "255 0\n"
     ]
    }
   ],
   "source": [
    "print(np.max(x_train), np.min(x_train))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# x = (x - u) / std\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "# x_train: [None, 28, 28] -> [None, 1]\n",
    "x_train_scaled = scaler.fit_transform(\n",
    "    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n",
    "x_valid_scaled = scaler.transform(\n",
    "    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n",
    "x_test_scaled = scaler.transform(\n",
    "    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.023144 -0.8105139\n"
     ]
    }
   ],
   "source": [
    "print(np.max(x_train_scaled), np.min(x_train_scaled))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tf.keras.models.Sequential()\n",
    "\n",
    "\"\"\"\n",
    "model = keras.models.Sequential()\n",
    "model.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "model.add(keras.layers.Dense(300, activation=\"relu\"))\n",
    "model.add(keras.layers.Dense(100, activation=\"relu\"))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))\n",
    "\"\"\"\n",
    "\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(300, activation='relu'),\n",
    "    keras.layers.Dense(100, activation='relu'),\n",
    "    keras.layers.Dense(10, activation='softmax')\n",
    "])\n",
    "\n",
    "# relu: y = max(0, x)\n",
    "# softmax: 将向量变成概率分布. x = [x1, x2, x3], \n",
    "#          y = [e^x1/sum, e^x2/sum, e^x3/sum], sum = e^x1 + e^x2 + e^x3\n",
    "\n",
    "# reason for sparse: y->index. y->one_hot->[] \n",
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer = \"sgd\",\n",
    "              metrics = [\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 6s 117us/sample - loss: 0.8994 - accuracy: 0.7017 - val_loss: 0.6187 - val_accuracy: 0.7888\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 6s 110us/sample - loss: 0.5802 - accuracy: 0.7965 - val_loss: 0.5239 - val_accuracy: 0.8234\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 6s 113us/sample - loss: 0.5131 - accuracy: 0.8186 - val_loss: 0.4820 - val_accuracy: 0.8328\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 7s 119us/sample - loss: 0.4757 - accuracy: 0.8315 - val_loss: 0.4560 - val_accuracy: 0.8482\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 6s 115us/sample - loss: 0.4511 - accuracy: 0.8409 - val_loss: 0.4361 - val_accuracy: 0.8542\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 6s 118us/sample - loss: 0.4333 - accuracy: 0.8464 - val_loss: 0.4230 - val_accuracy: 0.8558\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 7s 118us/sample - loss: 0.4187 - accuracy: 0.8527 - val_loss: 0.4152 - val_accuracy: 0.8592\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 6s 115us/sample - loss: 0.4072 - accuracy: 0.8559 - val_loss: 0.4069 - val_accuracy: 0.8620\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 7s 121us/sample - loss: 0.3968 - accuracy: 0.8598 - val_loss: 0.3989 - val_accuracy: 0.8620\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 6s 112us/sample - loss: 0.3886 - accuracy: 0.8623 - val_loss: 0.3911 - val_accuracy: 0.8640\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train_scaled, y_train, epochs=10,\n",
    "                    validation_data=(x_valid_scaled, y_valid))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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uPzyy3n77bd59NFHu+iMRUQknaRvOHeihdsdKioqeO2113j77bfJzMxk6tSpTJgwgVWrVnV6H8aYxLzf72+xLSsrKzH/05/+lGnTpvHcc8+xfv36vfbhu/zyyznjjDPw+Xycf/75umctItJD6Z5zK7W1tRQUFJCZmcmqVat455138Pv9LFiwgE8//RQgcVl7+vTp/PnPf058t/mydmlpKStXriQajSZa4B0dq2/fvgDMnj07sX769Oncf//9hMPhFsfr06cPffr04bbbbuPyyy/vupMWEZG0onBuZcaMGYTDYUaOHMmNN97IUUcdRUlJCQ888ADnnHMO48ePZ+bMmQD85Cc/YefOnYwZM4bx48czf/58AH79619z+umnc8wxx9C7d+8Oj/WjH/2I//3f/2XixImJIAa48sor6d+/P+PGjWP8+PE88cQTiW0XX3wx/fr1Y+TIkd30ExARkVTTddFWvF4vL7/8crvbTj311BbL2dnZ3H///W1efXneeedx3nnntfl+cusY4Oijj2bNmjWJ5dtui72O3OVy8bvf/Y7f/e53bfbx5ptvctVVV3XqXERE5OCkcD6ITJo0iaysLO66665UV0VERLqRwvkg8sEHH6S6CiIicgDonrOIiEiaUTiLiIikGYWziIhImlE4i4iIpBmFs4iISJpROO+H5NGnWlu/fj1jxow5gLUREZGeQuEsIiKSZtK2n/Nv3vsNq2o6P9hEZ4woHMGPJ/+4w+033ngj/fr149vf/jYAt9xyCy6Xi/nz57Njxw5CoRC33XYbZ5111j4d1+/3c+211/L+++8n3v41bdo0li9fzuWXX04wGCQajfLMM8/Qp08fLrjgAqqqqohEIvz0pz9NvC5UREQODWkbzqkwc+ZMvvvd7ybCec6cObzyyivMmjWL3Nxctm/fzlFHHcWZZ57ZYuSpvbnnnnswxrBs2TJWrVrFySefzJo1a/jTn/7Ed77zHS6++GKCwSCRSIS5c+fSp08fXnrpJSA2OIaIiBxa0jac99TC7S4TJ05k69atbN68mW3btlFQUEBZWRnf+973WLBgAQ6Hg02bNrFlyxbKyso6vd8333yT66+/HoARI0YwYMAA1qxZw9FHH83tt99OVVUV55xzDkOHDmXs2LF8//vf58c//jGnn346xx57bHedroiIpCndc27l/PPP5+mnn+app55i5syZPP7442zbto0PPviAxYsXU1pa2maM5i/qa1/7Gi+88AIZGRl85StfYd68eQwbNowPP/yQsWPH8pOf/IRf/OIXXXIsERE5eKRtyzlVZs6cyVVXXcX27dt5/fXXmTNnDr169cLtdjN//nwqKyv3eZ/HHnssjz/+OCeccAJr1qxhw4YNDB8+nHXr1jF48GBmzZrFhg0bWLp0KSNGjKCwsJCvf/3r5Ofn8+CDD3bDWYqISDpTOLcyevRo6urq6Nu3L7179+biiy/mjDPOYOzYsRxxxBGMGDFin/f5rW99i2uvvZaxY8ficrmYPXs2Xq+XOXPm8Ne//hW3201ZWRk33XQTCxcu5Ic//CEOhwO32819993XDWcpIiLpTOHcjmXLliXmi4uLefvtt9stV19fT11dXbvbBg4cyEcffQSAz+fj4YcfblPmxhtv5MYbb2yx7pRTTuGUU075olUXEZEeQPecRURE0oxazvtp+fLlXHPNNS3Web1e3n333RTVSEREDnYK5/00evRoFi9enOpqiIhID6LL2iIiImlG4SwiIpJmFM4iIiJpRuEsIiKSZhTO+2FP4zmLiIh8UQrnHiAcDqe6CiIi0oXStivV57/8JYGVXTues3fkCMpuuqnD7V05nnN9fT1nnXVWu9979NFHufPOOzHGMG7cOP7617+yZcsWrrnmGtatWwfAfffdR58+fTj99NMTbxq78847qa+v55ZbbmHq1KlMmDCBN998k4suuohhw4Zx2223EQwGKSoq4vHHH6e0tJT6+nquv/563n//fYwx/PznP6e2tpalS5fy//7f/wNg9uzZrFu3jt///vf79fMVEZGukbbhnApdOZ6zz+fjueeea/O9FStWcNttt/HWW29RXFxMTU0NALNmzeL444/nueeeIxKJUF9fz44dO/Z4jGAwyPvvvw/Ajh07eOeddzDG8OCDD/Lb3/6Wu+66i1tvvZW8vLzEK0l37NiB2+3m9ttv54477sDtdvPYY49pgA0RkTSStuG8pxZud+nK8Zyttdx0001tvjdv3jzOP/98iouLASgsLARg3rx5PProowA4nU7y8vL2Gs4zZ85MzFdVVTFz5kw+++wzgsEggwYNAuC1117jySefTJQrKCgA4IQTTuDFF19k5MiRhEIhxo4du48/LRER6S5pG86p0jye8+eff95mPGe3283AgQM7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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 1s 69us/sample - loss: 0.4255 - accuracy: 0.8487\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.4255202187538147, 0.8487]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
